computercraftfandomcom_ru-20200213-history
Computer Craft Api RedNet,что это и зачем оно нужно
Вступление Итак несколько слов о том что реднет из себя представляет. Реднет по сути сеть по которой компьютеры , с установленными модемами могут передавать сообщения между собой, давать друг другу команды, передавать тексты и прочее. А теперь фактически чтобы выйти в реднет нужно 2 вещи - комп и модем. Как делать компьютер я надеюсь вы знаете, а модем делается так: Теперь, когда вы скрафтили модем, поставьте его с любой стороны вашего компьютера. А теперь перейдем к написанию программ для работы с сетью. Управляющие структуры Их не так много в реднете всего 7 но зато создать с их помощью можно многое. rednet.open() - открывает порт в указанной стороне. rednet.close() - закрывает порт в указанной стороне. rednet.isOpen() - проверяет статус вкл/выкл порта в указанной стороне (true/nil). rednet.announce() - передаёт пустое сообщение всем компьютерам в сети. rednet.send(,) - отправляет сообщение с текстом на компьютер с указанным ID. rednet.broadcast() - отправляет сообщение с текстом всем компьютерам в сети. rednet.receive() - принимает сообщения в течении указанного времени , возвращает ID, сообщение и расстояние до компьютера-источника(только для модемов). Непонятно? Одна закрывает, другая открывает… непонятно, что они вообще делают! Сейчас все объясню. Открывать и закрывать порты нужно для того чтобы разрешать или запрещать обмен данными компьютера и сети, если порт открыт - компьютер виден в сети и может передавать или принимать данные. rednet.announce() помогает протестировать сеть, исправна ли она, а для передачи данных эта команда бесполезна. rednet.broadcast() отправляет ВСЕМ компьютерам в сети ваше сообщение можно использовать для рекламы например - rednet.broadcast("Заходите в магазин болванок дяди Васи"). rednet.send(,) уже отправляет сообщение не всем, а только одному компу (который вам необходимо указать). rednet.receive() единственная из выше перечисленных функций, которая возвращает значения. Чтобы получить эти значения необходимо присвоить их переменным, например вот так: id,msg = rednet.receive(10) где id это будет айди отправителя а msg его сообщение. Расстояние, по-моему, неважно, оно может пригодиться только чтобы вычислить компютер-отправитель или чтобы помочь черепахе найти свой дом =D. Альтернативная сеть. Глобальные и локальные сети. Всем хороша "модемная" сеть и удобна - подключись и работай, и есть везде, и только один блок поставь и уже есть "интернет", но только один недостаток в ней - общедоступность. Но ведь это же достоинство. Не совсем так. Общедоступность значит «любой ололо подошел, подключился, и сделал программку с бесконечным циклом на спам "по всем каналам"» и вот уже не поговорить с кем ни будь, ни к другим компам достучатся не выйдет (я говорю про SMP, в одиночке понятное дело вам только Херобрин может начать спамить). А для дома, чтобы 2 компьютера соединить модемами - просто глупость. Но альтернатива есть! И альтернатива эта сеть не "глобальная" а "локальная", а обеспечивает эту локальную сеть уже не модем, а связка проводов из мода RedPower. В "локалке" будут уже только те компьютеры, которые вам нужны и никаких "левых" в ней не будет. По использованию "локалка" аналогична "глобалке". Все команды и принципы передачи те же, вот только не удобны кабеля, тем что их ПРИДЁТСЯ тянуть от компа к компу. И в заключение пища для мозга: вот бы неплохо было если бы локальные связки компов тоже могли "выходить в интернет"...Нет нет не напрямую а через...ПРОКСИ-СЕРВЕР! Ну то есть где то в локальной связке должен быть комп который будет и к "глобалке" подключен и к "локалке" и пропускать запросы компов "в мир", назад пускать ответы этого самого "мира" на запросы, а всякий мусор (например тролинг спам и т.д.) не пропускал... Программы для сети. И вот, наконец, после такого количества теории мы перейдем к практике ниже я буду выкладывать программы, созданые для реднет и комментарии к ним! Название:Hello world! Задача: передать с одного компьютера на другой сообщение «Hello world!» Решение: Постройте 2 компьютера и присоедините к ним 2 модема. Теперь откройте компьютер, который будет отправителем и напишите такую программу: rednet.open("сторона с которой у вас стоит модем") -- открываем порт для передачи rednet.broadcast("Hello world!") -- собственно передаем сообщение rednet.close("сторона с которой у вас стоит модем") -- закрываем порт А в компьютере-приемнике напишите такой код rednet.open("сторона с которой у вас стоит модем") - открываем порт для приема id, msg = rednet.receive(50) - ждем сообщения textutils.slowPrint ("User ".. id .. " sent you an email") - выводим отправителя print (msg) - и сообщение на экран rednet.close("сторона с которой у вас стоит модем") - закрываем порт Запустите сначала программу приемник, а потом отправитель, и если вы все сделали правильно , через некоторое время сообщение вам передастся. Название: Сетевой калькулятор Задача: Сделать открытый для всех комп который принимает 2 числа а возвращает их сумму Решение: Програма для самого сетевого калькулятора rednet.open(" сторона с которой у вас стоит модем") - открываем порт для приема while true do - делаеи безконечный цикл id, msg1 = rednet.receive() - принимаем первое id, msg2 = rednet.receive() - и втрое число sum1 = msg1 + msg2 - складываем их sum2 = sum1.. " " - фактически преобразуем число из типа numeric в string print("----------") от сюда print(id) print(msg1) print(msg2) print(sum2) и до сюда вывод в консоль сервера полученых и отправленых данных (для отчетности) rednet.send(id , sum2) - отправляем ответ end конец цикла rednet.close(" сторона с которой у вас стоит модем ") закрываем порт А для компа (компов) который будет отправлять числа сетевому калькулятору нужна вот такая програма servId = - здесь необходимо указать ид компа-калькулятора в сети (цифрой) rednet.open(" сторона с которой у вас стоит модем ") - открываем порт print("Vvedite 2 chisla") - просим ввести 2 числа msg1=read() - получаем первое msg2=read() - и второе число rednet.send(servId, msg1) - отправляем их rednet.send(servId, msg2) - причем именно в раздельных сообщениях id, sum = rednet.receive(100) - ждем ответа print("Otvet servera") - выводим подсказку print(sum) - выводим ответ rednet.close(" сторона с которой у вас стоит модем ") - закрываем порт Правда в этой програме есть один недостаток, если отправить не числа а буквы то это вызовит ошибки и прекращение выполнения програмы компа-калькулятора. Название:"Сетевой чат "флудилко" би Dimach" Задача:Создать чат сервер,позволяющий нескольким компам разговаривать в виде чата Коментарий:В свободное от работы время соорудил (за пол часа) програмку чат (очень продуманую(сам горжусь)) версия клиента на данный момент 1.0 сервера 1.0 сечас реализовано в програме Переписка нескольких компов в режиме чата Вывод ид отправителя сообщения Режим "история чата" представляющий все сообщения как единое целое в буфере Оптимизяция буфера в виде переодической его очистки (максимум 30 строк не сщитая технические потом очистка) В случае разрыва связи с сервером (или неудачном подключении) вывод сообщения об ошибке с предложением поменять ид сервера или попробывать подключится снова Выноски в отдельный констант-блок всех сообшений сервера позволяюшие удобно менять их Защита от постороних сообщений (прием только от сервера ни от кого больше) В планах Замена ид компов псевдонимами Функция "аноним" позволяющая скривать свой ид при переписке Пометка переписщиков флажками (гость,постоялец,админ) Функция "сечас онлайн" Возможность бана некоторых ид Добавление спам фильтров То что предложите Вы Пока не придумал))) Решение: Для клиентской части ---- --Блок констант отвечающих за выводимый текст-подсказки servIdRead="Vvedite id servera k kotoromu hotite podkluchitsya" connectSucses="Mogete nachinat fludit))" thisUserIdOut = "Polzovatel vuhel" thisUserIdIn = "Polzovatel vohol" fail = "Osibka soidineniya s serverom" exit = "exit" side = "сторона с которой у вас стоит модем" connect = "Podogdite idet soidinenie s serverom" --конец блока констант b = true while b do rednet.open(side) print(servIdRead) servId1 = read() servId = servId1 * 1 rednet.send(servId,thisUserIdIn) term.clear() print(connect) id, msg1 = rednet.receive(30) term.clear() if id servId then print(msg1) b = false else b = true print(fail) end end a = true print(connectSucses) while a do msg = read() if msg exit then a = false else rednet.send(servId, msg) term.clear() id, msg1 = rednet.receive() if id servId then print(msg1) else print(fail) end msg = " " end end rednet.send(servId, thisUserIdOut) rednet.close(side) ---- Для серверной части ---- side = "сторона с которой у вас стоит модем" rednet.open(side) rednet.broadcast("Server online") a = 0 while true do chatHistori = "<-----------Chat fludilko by Dimach!------------> " chatHistori = chatHistori.. "<--------Avtomaticheskaya ochistka chata--------> " while a<30 do id, msg = rednet.receive() chatHistori = chatHistori.. id.. ":" ..msg.. " " rednet.broadcast(chatHistori) print(id..":"..msg) a = a + 1 end a = 0 end ---- thumb|left|356pxthumb|left|Модифицированная версия. Многие функции можно добавить изменяя сервер Извините что без коментов код большой и сложный просто скопипасте,ок!? ---- Гайд написал: Dimach. Исправлял грамматические ошибки: Mef45 Если что непонятно или интересно спрашивайте - помогу чем смогу!!! Категория:Работа с API интерфейсами Категория:Програмы